home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Misc / aa_m68k_Only / NDCamera.0.21 / Source / MiscSources.subproj / MiscStringSearching.m < prev    next >
Encoding:
Text File  |  1995-04-12  |  23.6 KB  |  691 lines

  1. //
  2. //    MiscStringSearching.m
  3. //        Written by Don Yacktman Copyright (c) 1993 by Don Yacktman.
  4. //                Version 1.95  All rights reserved.
  5. //        This notice may not be removed from this source code.
  6. //
  7. //    This object is included in the MiscKit by permission from the author
  8. //    and its use is governed by the MiscKit license, found in the file
  9. //    "LICENSE.rtf" in the MiscKit distribution.  Please refer to that file
  10. //    for a list of all applicable permissions and restrictions.
  11. //    
  12.  
  13. #import <misckit/MiscString.h>
  14.  
  15. @implementation MiscString(Searching)
  16.  
  17. // This category is composed of methods which search a
  18. // MiscString and return pointers to the start of specific
  19. // substrings within the MiscString.
  20.  
  21. - (int)spotOf:(char)aChar
  22. {
  23.   return [self spotOf:aChar occurrenceNum:0 caseSensitive:YES];
  24. }
  25.  
  26. - (int)spotOf:(char)aChar caseSensitive:(BOOL)sense
  27. {
  28.   return [self spotOf:aChar occurrenceNum:0 caseSensitive:sense];
  29. }
  30.  
  31. - (int)spotOf:(char)aChar occurrenceNum:(int)n
  32. {
  33.   return [self spotOf:aChar occurrenceNum:n caseSensitive:YES];
  34. }
  35.  
  36. - (int)rspotOf:(char)aChar
  37. {
  38.   return [self rspotOf:aChar occurrenceNum:0 caseSensitive:YES];
  39. }
  40.  
  41. - (int)rspotOf:(char)aChar caseSensitive:(BOOL)sense
  42. {
  43.   return [self rspotOf:aChar occurrenceNum:0 caseSensitive:sense];
  44. }
  45.  
  46. - (int)rspotOf:(char)aChar occurrenceNum:(int)n
  47. {
  48.   return [self rspotOf:aChar occurrenceNum:n caseSensitive:YES];
  49. }
  50.  
  51. - (int)spotOf:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  52. {
  53.   int currnum = -1;
  54.   int count = 0;
  55.   
  56.   if (n<0) return -1;
  57.   
  58.   while ((currnum < n) && (count < length)) {
  59.     if (!sense) {
  60.       if (NXToUpper(buffer[count]) == NXToUpper(aChar)) currnum++;
  61.      }
  62.     else {
  63.       if (buffer[count] == aChar) currnum++;
  64.      }
  65.     count++;
  66.    }
  67.   if (currnum != n) return -1;
  68.   return (count-1);
  69. }
  70.  
  71. - (int)rspotOf:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  72. {
  73.   int currnum = -1;
  74.   int count = length-1;
  75.   
  76.   if (n<0) return -1;
  77.   
  78.   while ((currnum < n) && (count >= 0)) {
  79.     if (!sense) {
  80.       if (NXToUpper(buffer[count]) == NXToUpper(aChar)) currnum++;
  81.      }
  82.     else {
  83.       if (buffer[count] == aChar) currnum++;
  84.      }
  85.     count--;
  86.    }
  87.   if (currnum != n) return -1;
  88.   return (count+1);
  89. }
  90.  
  91. - (const char *)rindex:(char)aChar
  92. {
  93.     return [self rindex:aChar occurrenceNum:0 caseSensitive:YES];
  94. }
  95.  
  96. - (const char *)rindex:(char)aChar occurrenceNum:(int)n
  97. {
  98.     return [self rindex:aChar occurrenceNum:n caseSensitive:YES];
  99. }
  100.  
  101. - (const char *)rindex:(char)aChar caseSensitive:(BOOL)sense
  102. {
  103.     return [self rindex:aChar occurrenceNum:0 caseSensitive:sense];
  104. }
  105.  
  106. - (const char *)rindex:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  107. {
  108.   int num;
  109.   num = [self rspotOf:aChar occurrenceNum:n caseSensitive:sense];
  110.   if (num == -1) return NULL;
  111.   return buffer+num;
  112. }
  113.  
  114. - (const char *)index:(char)aChar
  115. {
  116.     return [self index:aChar occurrenceNum:0 caseSensitive:YES];
  117. }
  118.  
  119. - (const char *)index:(char)aChar occurrenceNum:(int)n
  120. {
  121.     return [self index:aChar occurrenceNum:n caseSensitive:YES];
  122. }
  123.  
  124. - (const char *)index:(char)aChar caseSensitive:(BOOL)sense
  125. {
  126.     return [self index:aChar occurrenceNum:0 caseSensitive:sense];
  127. }
  128.  
  129. - (const char *)index:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  130. {
  131.   int num;
  132.   num = [self spotOf:aChar occurrenceNum:n caseSensitive:sense];
  133.   if (num==-1) return NULL;
  134.   return buffer+num;
  135. }
  136.  
  137. /* No longer used:
  138. - (const char *)strstr:(const char *)subString
  139. {
  140.     if (!(buffer||subString)) return NULL;
  141.     return strstr(buffer, subString);
  142. }
  143. */
  144.  
  145. - (int)spotOfChars:(const char *)aString
  146. {
  147.     return [self spotOfChars:aString occurrenceNum:0 caseSensitive:YES];
  148. }
  149.  
  150. - (int)spotOfChars:(const char *)aString caseSensitive:(BOOL)sense
  151. {
  152.     return [self spotOfChars:aString occurrenceNum:0 caseSensitive:sense];
  153. }
  154.  
  155. - (int)spotOfChars:(const char *)aString occurrenceNum:(int)n
  156. {
  157.     return [self spotOfChars:aString occurrenceNum:n caseSensitive:YES];
  158. }
  159.  
  160. - (int)spotOfChars:(const char *)aString occurrenceNum:(int)n
  161.         caseSensitive:(BOOL)sense
  162. {
  163.     int currnum = -1;
  164.     int count = 0;
  165.     id tempStr;
  166.  
  167.     if (n < 0) return -1;
  168.     tempStr = [MiscString newWithString:aString];
  169.     while ((currnum < n) && (count < length)) {
  170.         if ([tempStr spotOf:buffer[count] caseSensitive:sense] != -1)
  171.             currnum++;
  172.         count++;
  173.     }
  174.     [tempStr free];
  175.     if (currnum != n) return -1;
  176.     return (count - 1);
  177. }
  178.  
  179. - (int)rspotOfChars:(const char *)aString
  180. {
  181.     return [self rspotOfChars:aString occurrenceNum:0 caseSensitive:YES];
  182. }
  183.  
  184. - (int)rspotOfChars:(const char *)aString caseSensitive:(BOOL)sense
  185. {
  186.     return [self rspotOfChars:aString occurrenceNum:0 caseSensitive:sense];
  187. }
  188.  
  189. - (int)rspotOfChars:(const char *)aString occurrenceNum:(int)n
  190. {
  191.     return [self rspotOfChars:aString occurrenceNum:n caseSensitive:YES];
  192. }
  193.  
  194. - (int)rspotOfChars:(const char *)aString occurrenceNum:(int)n
  195.         caseSensitive:(BOOL)sense
  196. {
  197.     int currnum = -1;
  198.     int count = length - 1;
  199.     id tempStr;
  200.  
  201.     if (n<0) return -1;
  202.     tempStr = [[self class] newWithString:aString];
  203.     while ((currnum < n) && (count >= 0)) {
  204.         if ([tempStr spotOf:buffer[count] caseSensitive:sense] != -1)
  205.             currnum++;
  206.         count--;
  207.     }
  208.     if (currnum != n) return -1;
  209.     return (count + 1);
  210. }
  211.  
  212. - (const char *)rindexOfChars:(const char *)aString
  213. {
  214.     return [self rindexOfChars:aString occurrenceNum:0 caseSensitive:YES];
  215. }
  216.  
  217. - (const char *)rindexOfChars:(const char *)aString caseSensitive:(BOOL)sense
  218. {
  219.     return [self rindexOfChars:aString occurrenceNum:0 caseSensitive:sense];
  220. }
  221.  
  222. - (const char *)rindexOfChars:(const char *)aString occurrenceNum:(int)n
  223. {
  224.     return [self rindexOfChars:aString occurrenceNum:n caseSensitive:YES];
  225. }
  226.  
  227. - (const char *)rindexOfChars:(const char *)aString occurrenceNum:(int)n
  228.         caseSensitive:(BOOL)sense
  229. {
  230.     int num;
  231.     num = [self rspotOfChars:aString occurrenceNum:n caseSensitive:sense];
  232.     if (num == -1) return NULL;
  233.     return (const char *)(buffer+num);
  234. }
  235.  
  236. - (const char *)indexOfChars:(const char *)aString
  237. {
  238.     return [self indexOfChars:aString occurrenceNum:0 caseSensitive:YES];
  239. }
  240.  
  241. - (const char *)indexOfChars:(const char *)aString caseSensitive:(BOOL)sense
  242. {
  243.     return [self indexOfChars:aString occurrenceNum:0 caseSensitive:sense];
  244. }
  245.  
  246. - (const char *)indexOfChars:(const char *)aString occurrenceNum:(int)n
  247. {
  248.     return [self indexOfChars:aString occurrenceNum:n caseSensitive:YES];
  249. }
  250.  
  251. - (const char *)indexOfChars:(const char *)aString occurrenceNum:(int)n
  252.         caseSensitive:(BOOL)sense
  253. {
  254.     int num;
  255.     num = [self spotOfChars:aString occurrenceNum:n caseSensitive:sense];
  256.     if (num == -1) return NULL;
  257.     return (const char *)(buffer+num);
  258. }
  259.  
  260. - (BOOL) hasType:(int)type
  261. {
  262.   int i;
  263.   
  264.   for (i=0;i<length;i++) {
  265.     if (type & MISC_UPPER)  if (NXIsUpper(buffer[i]))  return YES;
  266.     if (type & MISC_LOWER)  if (NXIsLower(buffer[i]))  return YES;
  267.     if (type & MISC_DIGIT)  if (NXIsDigit(buffer[i]))  return YES;
  268.     if (type & MISC_XDIGIT) if (NXIsXDigit(buffer[i])) return YES;
  269.     if (type & MISC_PUNCT)  if (NXIsPunct(buffer[i]))  return YES;
  270.     if (type & MISC_ASCII)  if (NXIsAscii(buffer[i]))  return YES;
  271.     if (type & MISC_CNTRL)  if (NXIsCntrl(buffer[i]))  return YES;
  272.     if (type & MISC_PRINT)  if (NXIsPrint(buffer[i]))  return YES;
  273.     if (type & MISC_SPACE)  if (NXIsSpace(buffer[i]))  return YES;
  274.     if (type & MISC_GRAPH)  if (NXIsGraph(buffer[i]))  return YES;
  275.    }
  276.   return NO;
  277. }
  278.  
  279. - (BOOL) isAllOfType:(int)type
  280. {
  281.   int i, j;
  282.  
  283.   if (length <= 0) return NO;  
  284.   
  285.   for (i=0;i<length;i++) {
  286.     j = 0;
  287.     if (type & MISC_UPPER)  j |= (NXIsUpper(buffer[i]));
  288.     if (type & MISC_LOWER)  j |= (NXIsLower(buffer[i]));
  289.     if (type & MISC_DIGIT)  j |= (NXIsDigit(buffer[i]));
  290.     if (type & MISC_XDIGIT) j |= (NXIsXDigit(buffer[i]));
  291.     if (type & MISC_PUNCT)  j |= (NXIsPunct(buffer[i]));
  292.     if (type & MISC_ASCII)  j |= (NXIsAscii(buffer[i]));
  293.     if (type & MISC_CNTRL)  j |= (NXIsCntrl(buffer[i]));
  294.     if (type & MISC_PRINT)  j |= (NXIsPrint(buffer[i]));
  295.     if (type & MISC_SPACE)  j |= (NXIsSpace(buffer[i]));
  296.     if (type & MISC_GRAPH)  j |= (NXIsGraph(buffer[i]));
  297.     if (!j) return NO;
  298.    }
  299.   return YES;
  300. }
  301.  
  302. - (int)spotOfType:(int)type occurrenceNum:(int)n
  303. {
  304.   int i, currnum = -1;
  305.  
  306.   if (n < 0) return -1;
  307.  
  308.   for (i=0;(i < length) && (currnum < n);i++) {
  309.     if (type & MISC_UPPER)  if (NXIsUpper(buffer[i]))  {currnum++; continue;}
  310.     if (type & MISC_LOWER)  if (NXIsLower(buffer[i]))  {currnum++; continue;}
  311.     if (type & MISC_DIGIT)  if (NXIsDigit(buffer[i]))  {currnum++; continue;}
  312.     if (type & MISC_XDIGIT) if (NXIsXDigit(buffer[i])) {currnum++; continue;}
  313.     if (type & MISC_PUNCT)  if (NXIsPunct(buffer[i]))  {currnum++; continue;}
  314.     if (type & MISC_ASCII)  if (NXIsAscii(buffer[i]))  {currnum++; continue;}
  315.     if (type & MISC_CNTRL)  if (NXIsCntrl(buffer[i]))  {currnum++; continue;}
  316.     if (type & MISC_PRINT)  if (NXIsPrint(buffer[i]))  {currnum++; continue;}
  317.     if (type & MISC_SPACE)  if (NXIsSpace(buffer[i]))  {currnum++; continue;}
  318.     if (type & MISC_GRAPH)  if (NXIsGraph(buffer[i]))  {currnum++; continue;}
  319.    }
  320.  
  321.   if (n == currnum) return i-1;
  322.   return -1;
  323. }
  324.  
  325.  
  326. - (int)rspotOfType:(int)type occurrenceNum:(int)n
  327. {
  328.   int i, currnum = -1;
  329.  
  330.   if (n < 0) return -1;
  331.  
  332.   for (i=(length-1);(i >= 0) && (currnum < n);i--) {
  333.     if (type & MISC_UPPER)  if (NXIsUpper(buffer[i]))  {currnum++; continue;}
  334.     if (type & MISC_LOWER)  if (NXIsLower(buffer[i]))  {currnum++; continue;}
  335.     if (type & MISC_DIGIT)  if (NXIsDigit(buffer[i]))  {currnum++; continue;}
  336.     if (type & MISC_XDIGIT) if (NXIsXDigit(buffer[i])) {currnum++; continue;}
  337.     if (type & MISC_PUNCT)  if (NXIsPunct(buffer[i]))  {currnum++; continue;}
  338.     if (type & MISC_ASCII)  if (NXIsAscii(buffer[i]))  {currnum++; continue;}
  339.     if (type & MISC_CNTRL)  if (NXIsCntrl(buffer[i]))  {currnum++; continue;}
  340.     if (type & MISC_PRINT)  if (NXIsPrint(buffer[i]))  {currnum++; continue;}
  341.     if (type & MISC_SPACE)  if (NXIsSpace(buffer[i]))  {currnum++; continue;}
  342.     if (type & MISC_GRAPH)  if (NXIsGraph(buffer[i]))  {currnum++; continue;}
  343.    }
  344.  
  345.   if (n == currnum) return i+1;
  346.   return -1;
  347. }
  348.  
  349. - (int)spotOfStr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  350. {
  351.   int currnum = -1, currspot = 0, len;
  352.   char fchar;
  353.  
  354.   if (!str || (n < 0)) return -1;
  355.   len = strlen(str);
  356.   if (len == 0) return -1;  //Can't have 0 for len...
  357.   fchar = (sense)? str[0]:NXToUpper(str[0]);
  358.  
  359.   while ((currnum < n) && (currspot <= (length-len))) {
  360.     //search for a potential start of match
  361.     while ((currspot <= (length-len)) && (fchar != ((sense)? buffer[currspot]:NXToUpper(buffer[currspot]))))
  362.       currspot++;
  363.     //check for match
  364.     if (!NXOrderStrings((unsigned char *)str,(unsigned char *)buffer+currspot,sense,len,orderTable)) {
  365.       currnum++;
  366.       //if we've found the nth, return the spot
  367.       if (currnum == n) return currspot;
  368.       //if overlap is YES, the next match could potentially be at the next
  369.       //character.  If NO, then continue searching after the matched portion.
  370.       if (overlap) currspot++;
  371.       else currspot += len;
  372.     }
  373.     else currspot++;   // didn't match, keep looking
  374.   }
  375.   //nth occurrence was not found
  376.   return -1;
  377. }
  378.  
  379.  
  380. - (int)rspotOfStr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  381. {
  382.   int num = [self numOf:str caseSensitive:sense overlap:overlap];
  383.   if ((num <= 0) || (n < 0)) return -1;
  384.   return [self spotOfStr:str occurrenceNum:num-1-n caseSensitive:sense overlap:overlap];
  385. }
  386.  
  387.  
  388. - (int)spotOfString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  389. {
  390.   if (![sender respondsTo:@selector(stringValue)]) return -1;
  391.   return [self spotOfStr:[sender stringValue] occurrenceNum:n caseSensitive:sense overlap:overlap];
  392. }
  393.  
  394. - (int)rspotOfString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  395. {
  396.   if (![sender respondsTo:@selector(stringValue)]) return -1;
  397.   return [self rspotOfStr:[sender stringValue] occurrenceNum:n caseSensitive:sense overlap:overlap];
  398. }
  399.  
  400. - (const char *)strstr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  401. {
  402.   int spot = [self spotOfStr:str occurrenceNum:n caseSensitive:sense overlap:overlap];
  403.  
  404.   if (spot < 0) return NULL;
  405.   return (const char *)buffer+spot;
  406. }
  407.  
  408.  
  409. - (const char *)strString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  410. {
  411.   if (![sender respondsTo:@selector(stringValue)]) return NULL;
  412.   return [self strstr:[sender stringValue] occurrenceNum:n caseSensitive:sense overlap:overlap];
  413. }
  414.  
  415. - (const char *)rstrstr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  416. {
  417.   int spot = [self rspotOfStr:str occurrenceNum:n caseSensitive:sense overlap:overlap];
  418.  
  419.   if (spot < 0) return NULL;
  420.   return (const char *)buffer+spot;
  421. }
  422.  
  423.  
  424. - (const char *)rstrString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  425. {
  426.   if (![sender respondsTo:@selector(stringValue)]) return NULL;
  427.   return [self rstrstr:[sender stringValue] occurrenceNum:n caseSensitive:sense overlap:overlap];
  428. }
  429.  
  430. - (int)numOfType:(int)type
  431. {
  432.   int i, currnum = 0;
  433.  
  434.   for (i=0;i<length;i++) {
  435.     if (type & MISC_UPPER)  if (NXIsUpper(buffer[i]))  {currnum++; continue;}
  436.     if (type & MISC_LOWER)  if (NXIsLower(buffer[i]))  {currnum++; continue;}
  437.     if (type & MISC_DIGIT)  if (NXIsDigit(buffer[i]))  {currnum++; continue;}
  438.     if (type & MISC_XDIGIT) if (NXIsXDigit(buffer[i])) {currnum++; continue;}
  439.     if (type & MISC_PUNCT)  if (NXIsPunct(buffer[i]))  {currnum++; continue;}
  440.     if (type & MISC_ASCII)  if (NXIsAscii(buffer[i]))  {currnum++; continue;}
  441.     if (type & MISC_CNTRL)  if (NXIsCntrl(buffer[i]))  {currnum++; continue;}
  442.     if (type & MISC_PRINT)  if (NXIsPrint(buffer[i]))  {currnum++; continue;}
  443.     if (type & MISC_SPACE)  if (NXIsSpace(buffer[i]))  {currnum++; continue;}
  444.     if (type & MISC_GRAPH)  if (NXIsGraph(buffer[i]))  {currnum++; continue;}
  445.    }
  446.  
  447.   return currnum;
  448. }
  449.  
  450.  
  451. - (int)numOf:(const char *)str caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  452. {
  453.   int currnum = 0, currspot = 0, len;
  454.   char fchar;
  455.  
  456.   if (!str || ((len = strlen(str)) == 0)) return 0;
  457.   fchar = (sense)? str[0]:NXToUpper(str[0]);
  458.  
  459.   while (currspot <= (length-len)) {
  460.     while ((currspot <= (length-len)) && (fchar != ((sense)? buffer[currspot]:NXToUpper(buffer[currspot]))))
  461.       currspot++;
  462.     if (!NXOrderStrings((unsigned char *)str,(unsigned char *)buffer+currspot,sense,len,orderTable)) {
  463.       currnum++;
  464.       if (overlap) currspot++;
  465.       else currspot += len;
  466.      }
  467.     else currspot++;
  468.    }
  469.  
  470.   return currnum;
  471. }
  472.  
  473.  
  474. - (int)numOfString:(id)sender caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  475. {
  476.   if (![sender respondsTo:@selector(stringValue)]) return 0;
  477.   return [self numOf:[sender stringValue] caseSensitive:sense overlap:overlap];
  478. }
  479.  
  480.  
  481. /*******************************************************************/
  482. /**************   Convenience methods ******************************/
  483. /*******************************************************************/
  484.  
  485.  
  486. - (int)spotOfStr:(const char *)str
  487. { return [self spotOfStr:str occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  488.  
  489. - (int)spotOfStr:(const char *)str occurrenceNum:(int)n
  490. { return [self spotOfStr:str occurrenceNum:n caseSensitive:YES overlap:NO]; }
  491.  
  492. - (int)spotOfStr:(const char *)str caseSensitive:(BOOL)sense
  493. { return [self spotOfStr:str occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  494.  
  495. - (int)spotOfStr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense
  496. { return [self spotOfStr:str occurrenceNum:n caseSensitive:sense overlap:NO]; }
  497.  
  498. - (int)spotOfStr:(const char *)str overlap:(BOOL)overlap
  499. { return [self spotOfStr:str occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  500.  
  501. - (int)spotOfStr:(const char *)str occurrenceNum:(int)n overlap:(BOOL)overlap
  502. { return [self spotOfStr:str occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  503.  
  504. - (int)spotOfStr:(const char *)str caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  505. { return [self spotOfStr:str occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  506.  
  507.  
  508.  
  509.  
  510. - (int)rspotOfStr:(const char *)str
  511. { return [self rspotOfStr:str occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  512.  
  513. - (int)rspotOfStr:(const char *)str occurrenceNum:(int)n
  514. { return [self rspotOfStr:str occurrenceNum:n caseSensitive:YES overlap:NO]; }
  515.  
  516. - (int)rspotOfStr:(const char *)str caseSensitive:(BOOL)sense
  517. { return [self rspotOfStr:str occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  518.  
  519. - (int)rspotOfStr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense
  520. { return [self rspotOfStr:str occurrenceNum:n caseSensitive:sense overlap:NO]; }
  521.  
  522. - (int)rspotOfStr:(const char *)str overlap:(BOOL)overlap
  523. { return [self rspotOfStr:str occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  524.  
  525. - (int)rspotOfStr:(const char *)str occurrenceNum:(int)n overlap:(BOOL)overlap
  526. { return [self rspotOfStr:str occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  527.  
  528. - (int)rspotOfStr:(const char *)str caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  529. { return [self rspotOfStr:str occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  530.  
  531.  
  532.  
  533. - (int)spotOfString:(id)sender
  534. { return [self spotOfString:sender occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  535.  
  536. - (int)spotOfString:(id)sender occurrenceNum:(int)n
  537. { return [self spotOfString:sender occurrenceNum:n caseSensitive:YES overlap:NO]; }
  538.  
  539. - (int)spotOfString:(id)sender caseSensitive:(BOOL)sense
  540. { return [self spotOfString:sender occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  541.  
  542. - (int)spotOfString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense
  543. { return [self spotOfString:sender occurrenceNum:n caseSensitive:sense overlap:NO]; }
  544.  
  545. - (int)spotOfString:(id)sender overlap:(BOOL)overlap
  546. { return [self spotOfString:sender occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  547.  
  548. - (int)spotOfString:(id)sender occurrenceNum:(int)n overlap:(BOOL)overlap
  549. { return [self spotOfString:sender occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  550.  
  551. - (int)spotOfString:(id)sender caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  552. { return [self spotOfString:sender occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  553.  
  554.  
  555.  
  556. - (int)rspotOfString:(id)sender
  557. { return [self rspotOfString:sender occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  558.  
  559. - (int)rspotOfString:(id)sender occurrenceNum:(int)n
  560. { return [self rspotOfString:sender occurrenceNum:n caseSensitive:YES overlap:NO]; }
  561.  
  562. - (int)rspotOfString:(id)sender caseSensitive:(BOOL)sense
  563. { return [self rspotOfString:sender occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  564.  
  565. - (int)rspotOfString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense
  566. { return [self rspotOfString:sender occurrenceNum:n caseSensitive:sense overlap:NO]; }
  567.  
  568. - (int)rspotOfString:(id)sender overlap:(BOOL)overlap
  569. { return [self rspotOfString:sender occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  570.  
  571. - (int)rspotOfString:(id)sender occurrenceNum:(int)n overlap:(BOOL)overlap
  572. { return [self rspotOfString:sender occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  573.  
  574. - (int)rspotOfString:(id)sender caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  575. { return [self rspotOfString:sender occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  576.  
  577. - (const char *)strstr:(const char *)str
  578. { return [self strstr:str occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  579.  
  580. - (const char *)strstr:(const char *)str occurrenceNum:(int)n
  581. { return [self strstr:str occurrenceNum:n caseSensitive:YES overlap:NO]; }
  582.  
  583. - (const char *)strstr:(const char *)str caseSensitive:(BOOL)sense
  584. { return [self strstr:str occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  585.  
  586. - (const char *)strstr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense
  587. { return [self strstr:str occurrenceNum:n caseSensitive:sense overlap:NO]; }
  588.  
  589. - (const char *)strstr:(const char *)str overlap:(BOOL)overlap
  590. { return [self strstr:str occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  591.  
  592. - (const char *)strstr:(const char *)str occurrenceNum:(int)n overlap:(BOOL)overlap
  593. { return [self strstr:str occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  594.  
  595. - (const char *)strstr:(const char *)str caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  596. { return [self strstr:str occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  597.  
  598.  
  599.  
  600. - (const char *)rstrstr:(const char *)str
  601. { return [self rstrstr:str occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  602.  
  603. - (const char *)rstrstr:(const char *)str occurrenceNum:(int)n
  604. { return [self rstrstr:str occurrenceNum:n caseSensitive:YES overlap:NO]; }
  605.  
  606. - (const char *)rstrstr:(const char *)str caseSensitive:(BOOL)sense
  607. { return [self rstrstr:str occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  608.  
  609. - (const char *)rstrstr:(const char *)str occurrenceNum:(int)n caseSensitive:(BOOL)sense
  610. { return [self rstrstr:str occurrenceNum:n caseSensitive:sense overlap:NO]; }
  611.  
  612. - (const char *)rstrstr:(const char *)str overlap:(BOOL)overlap
  613. { return [self rstrstr:str occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  614.  
  615. - (const char *)rstrstr:(const char *)str occurrenceNum:(int)n overlap:(BOOL)overlap
  616. { return [self rstrstr:str occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  617.  
  618. - (const char *)rstrstr:(const char *)str caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  619. { return [self rstrstr:str occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  620.  
  621.  
  622. - (const char *)strString:(id)sender
  623. { return [self strString:sender occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  624.  
  625. - (const char *)strString:(id)sender occurrenceNum:(int)n
  626. { return [self strString:sender occurrenceNum:n caseSensitive:YES overlap:NO]; }
  627.  
  628. - (const char *)strString:(id)sender caseSensitive:(BOOL)sense
  629. { return [self strString:sender occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  630.  
  631. - (const char *)strString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense
  632. { return [self strString:sender occurrenceNum:n caseSensitive:sense overlap:NO]; }
  633.  
  634. - (const char *)strString:(id)sender overlap:(BOOL)overlap
  635. { return [self strString:sender occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  636.  
  637. - (const char *)strString:(id)sender occurrenceNum:(int)n overlap:(BOOL)overlap
  638. { return [self strString:sender occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  639.  
  640. - (const char *)strString:(id)sender caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  641. { return [self strString:sender occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  642.  
  643.  
  644.  
  645. - (const char *)rstrString:(id)sender
  646. { return [self rstrString:sender occurrenceNum:0 caseSensitive:YES overlap:NO]; }
  647.  
  648. - (const char *)rstrString:(id)sender occurrenceNum:(int)n
  649. { return [self rstrString:sender occurrenceNum:n caseSensitive:YES overlap:NO]; }
  650.  
  651. - (const char *)rstrString:(id)sender caseSensitive:(BOOL)sense
  652. { return [self rstrString:sender occurrenceNum:0 caseSensitive:sense overlap:NO]; }
  653.  
  654. - (const char *)rstrString:(id)sender occurrenceNum:(int)n caseSensitive:(BOOL)sense
  655. { return [self rstrString:sender occurrenceNum:n caseSensitive:sense overlap:NO]; }
  656.  
  657. - (const char *)rstrString:(id)sender overlap:(BOOL)overlap
  658. { return [self rstrString:sender occurrenceNum:0 caseSensitive:YES overlap:overlap]; }
  659.  
  660. - (const char *)rstrString:(id)sender occurrenceNum:(int)n overlap:(BOOL)overlap
  661. { return [self rstrString:sender occurrenceNum:n caseSensitive:YES overlap:overlap]; }
  662.  
  663. - (const char *)rstrString:(id)sender caseSensitive:(BOOL)sense overlap:(BOOL)overlap
  664. { return [self rstrString:sender occurrenceNum:0 caseSensitive:sense overlap:overlap]; }
  665.  
  666. - (int)spotOfType:(int)type
  667. { return [self spotOfType:type occurrenceNum:0]; }
  668.  
  669. - (int)rspotOfType:(int)type
  670. { return [self rspotOfType:type occurrenceNum:0]; }
  671.  
  672. - (int)numOf:(const char *)str
  673. { return [self numOf:str caseSensitive:YES overlap:NO]; }
  674.  
  675. - (int)numOf:(const char *)str caseSensitive:(BOOL)sense
  676. { return [self numOf:str caseSensitive:sense overlap:NO]; }
  677.  
  678. - (int)numOf:(const char *)str overlap:(BOOL)overlap
  679. { return [self numOf:str caseSensitive:YES overlap:overlap]; }
  680.  
  681. - (int)numOfString:(id)sender
  682. { return [self numOfString:sender caseSensitive:YES overlap:NO]; }
  683.  
  684. - (int)numOfString:(id)sender caseSensitive:(BOOL)sense
  685. { return [self numOfString:sender caseSensitive:sense overlap:NO]; }
  686.  
  687. - (int)numOfString:(id)sender overlap:(BOOL)overlap
  688. { return [self numOfString:sender caseSensitive:YES overlap:overlap]; }
  689.  
  690. @end
  691.